package UI.funcionarios;

import UI.PanelFormularioGenerico;
import excepciones.RangoNoValidoExcepcion;
import gestorBD.Controlador;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import uiMain.OpcionDeMenu;
import static uiMain.bienRaizOk.ventana;

public class PanelOpcionBuscarPropiedadPorCriterios extends OpcionDeMenu {

    JPanel panelTipoDeInmueble;//Norte
    JComboBox comboBoxTipoDeInmueble;

    JScrollPane scrollCentral;//Centro
    JPanel panelCentral;
    PanelFormularioGenerico panelFormularioInmueble;
    JComboBox comboBoxRol;
    PanelFormularioGenerico panelFormularioRol;

    JPanel panelDeBotones;//Sur
    String[] roles = {"Venta", "Alquiler"};

    String[] labelsCasa = {"Rango de área (Ej. 60-200) o '0' si es indiferente", "Rango de estrato (Ej. 2-4) o '0' si es indiferente", "Número mínimo de baños", "Número mínimo de alcobas", "Número mínimo de garajes"};
    String[] valoresCasa = {"", "", "", "", ""};

    String[] labelsApartamento = {"Rango de área (Ej. 60-200) o '0' si es indiferente", "Rango de estrato (Ej. 2-4) o '0' si es indiferente", "Número mínimo de baños", "Número mínimo de alcobas", "Número mínimo de parqueaderos"};
    String[] valoresApartamento = {"", "", "", "", ""};

    String[] labelsRol = {"Rango de precio de venta (Ej. 30000000-90000000) o '0' si es indiferente", "Rango de tarifa de arrendamiento (Ej. 500000-100000) o '0' si es indiferente"};
    String[] valoresRol = {"", ""};
    int[] tiposDeCampoRol;

    @Override
    public void ejecutar() {
        this.setLayout(new BorderLayout());

        //Se crea la zona norte, en la cual está el label y el combobox para seleccionar casa o apartamento
        JLabel labelSeleccioneTipoDeInmueble = new JLabel("Seleccione el tipo de inmueble que desea buscar");
        String[] tiposDeInmueble = {"Apartamento", "Casa"};
        comboBoxTipoDeInmueble = new JComboBox(tiposDeInmueble);
        this.panelTipoDeInmueble = new JPanel(new FlowLayout());
        this.panelTipoDeInmueble.add(labelSeleccioneTipoDeInmueble);
        this.panelTipoDeInmueble.add(comboBoxTipoDeInmueble);
        this.add(panelTipoDeInmueble, BorderLayout.NORTH);

        //Se crea la zona central, para el formulario del inmueble, y el formulario del rol con su combobox
        this.panelCentral = new JPanel();
        this.panelCentral.setLayout(new BoxLayout(panelCentral, BoxLayout.Y_AXIS));
        this.add(this.panelCentral, BorderLayout.CENTER);

        this.panelFormularioInmueble = new PanelFormularioGenerico();
        this.comboBoxRol = new JComboBox(roles);
        this.panelFormularioRol = new PanelFormularioGenerico();

        //Se crea la zona sur, para los botones buscar y volver
        this.panelDeBotones = new JPanel(new FlowLayout());
        JButton botonRegistrar = new JButton("Buscar");
        this.panelDeBotones.add(botonRegistrar);
        JButton botonVolver = new JButton("Volver");
        this.panelDeBotones.add(botonVolver);

        //Se añaden las funcionalidades
        comboBoxTipoDeInmueble.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                switch (comboBoxTipoDeInmueble.getSelectedIndex()) {
                    case 0://Apartamento

                        //Se resetean los campos del formulario del apartamento
                        String[] valoresVaciosApartamento = {"", "", "", "", ""};
                        valoresApartamento = valoresVaciosApartamento;
                        int[] tiposDeCampoApartamento = {0, 0, 2, 2, 2};
                        setPanelCentral(new PanelFormularioGenerico("Criterio", "Valor", labelsApartamento, valoresApartamento, tiposDeCampoApartamento));

                        //Se reinicia el panel del rol del inmueble y su combobox
                        reiniciarPanelRol(new JComboBox(roles), new PanelFormularioGenerico());

                        //Se le agrega el listener al nuevo comboBoxRol
                        comboBoxRol.addActionListener(new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent ae) {

                                switch (comboBoxRol.getSelectedIndex()) {
                                    case 0://Venta
                                        String[] valoresVaciosRol = {"", ""};
                                        valoresRol = valoresVaciosRol;
                                        int[] auxTipo = {0, 5};
                                        tiposDeCampoRol = auxTipo;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));

                                        break;
                                    case 1://Alquiler
                                        String[] valoresVaciosRol1 = {"", ""};
                                        valoresRol = valoresVaciosRol1;
                                        int[] auxTipo1 = {5, 0};
                                        tiposDeCampoRol = auxTipo1;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));
                                        break;
                                }
                            }
                        });
                        break;
                    case 1: //Casa
                        //Se resetean los campos del formulario de la casa
                        String[] valoresVaciosCasa = {"","", "", "", ""};
                        valoresCasa = valoresVaciosCasa;
                        int[] tiposDeCampoCasa = {0,0,2,2,2};
                        setPanelCentral(new PanelFormularioGenerico("Criterio", "Valor", labelsCasa, valoresCasa, tiposDeCampoCasa));

                        //Se reinicia el panel del rol del inmueble y su combobox
                        reiniciarPanelRol(new JComboBox(roles), new PanelFormularioGenerico());

                        //Se le agrega el listener al nuevo comboBoxRol
                        comboBoxRol.addActionListener(new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent ae) {

                                switch (comboBoxRol.getSelectedIndex()) {
                                    case 0://Venta
                                        String[] valoresVaciosRol = {"", ""};
                                        valoresRol = valoresVaciosRol;
                                        int[] auxTipo = {0, 5};
                                        tiposDeCampoRol = auxTipo;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));

                                        break;
                                    case 1://Alquiler
                                        String[] valoresVaciosRol1 = {"", ""};
                                        valoresRol = valoresVaciosRol1;
                                        int[] auxTipo1 = {5, 0};
                                        tiposDeCampoRol = auxTipo1;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));
                                        break;
                                    
                                }
                            }
                        });
                        break;

                }
            }
        });

        botonRegistrar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                boolean esApartamento = comboBoxTipoDeInmueble.getSelectedIndex() == 0;
                if (esApartamento) { //Si se va a registrar un apartamento
                    for (int i = 0; i < labelsApartamento.length; i++) {
                        if (valoresApartamento[i].equals("")) {
                            String textoPopUp = "El campo " + labelsApartamento[i].toLowerCase() + " es obligatorio";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }

                    for (int i = 0; i < labelsRol.length; i++) {
                        if (tiposDeCampoRol != null) {
                            if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 1) {
                                String textoPopUp = "El campo " + labelsRol[i].toLowerCase() + " es obligatorio";
                                JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                                return;
                            }
                        } else {
                            String textoPopUp = "Seleccione un rol para este apartamento";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }

                        if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 5) {
                            valoresRol[i] = "0";
                        }
                    }

                    
                    String rangoArea = valoresApartamento[0];
                    String rangoEstrato = valoresApartamento[1];
                    int numeroDeBanhos = Integer.parseInt(valoresApartamento[2]);
                    int numeroDeEspacios = Integer.parseInt(valoresApartamento[3]);
                    int numeroDeParqueaderos = Integer.parseInt(valoresApartamento[4]);

                    String rangoValor;
                    boolean esParaArrendar;
                    if(comboBoxRol.getSelectedIndex()==0){//Si es venta
                        rangoValor = valoresRol[0];
                        esParaArrendar = false;
                    }
                    else{
                        rangoValor = valoresRol[1];
                        esParaArrendar = true;
                    }
                    
                    String textoPopUp;
                    try {
                        textoPopUp = Controlador.buscarPropiedadPorCriterios(esApartamento,esParaArrendar,rangoArea,rangoEstrato,numeroDeBanhos,numeroDeEspacios,numeroDeParqueaderos,rangoValor);
                    } catch (RangoNoValidoExcepcion ex) {
                        textoPopUp = "Por favor complete el formulario con valores válidos";
                    }
                    JOptionPane.showMessageDialog(null, textoPopUp, "Información", JOptionPane.INFORMATION_MESSAGE);
                    if (textoPopUp.contains("correctamente")) {
                        ventana.mostrarPanelOpcionesDeFuncionario();
                    }

                } else { //Si se va a registrar una casa
                    for (int i = 0; i < labelsCasa.length; i++) {
                        if (valoresCasa[i].equals("")) {
                            String textoPopUp = "El campo " + labelsCasa[i].toLowerCase() + " es obligatorio";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }

                    for (int i = 0; i < labelsRol.length; i++) {
                        if (tiposDeCampoRol != null) {
                            if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 1) {
                                String textoPopUp = "El campo " + labelsRol[i].toLowerCase() + " es obligatorio";
                                JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                                return;
                            }
                        } else {
                            String textoPopUp = "Seleccione un rol para esta casa";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }

                        if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 5) {
                            valoresRol[i] = "0";
                        }
                    }

                    
                    String rangoArea = valoresCasa[0];
                    String rangoEstrato = valoresCasa[1];
                    int numeroDeBanhos = Integer.parseInt(valoresCasa[2]);
                    int numeroDeEspacios = Integer.parseInt(valoresCasa[3]);
                    int numeroDeGarajes = Integer.parseInt(valoresCasa[4]);

                    String rangoValor;
                    boolean esParaArrendar;
                    if(comboBoxRol.getSelectedIndex()==0){//Si es venta
                        rangoValor = valoresRol[0];
                        esParaArrendar = false;
                    }
                    else{
                        rangoValor = valoresRol[1];
                        esParaArrendar = true;
                    }
                    
                    String textoPopUp;
                    try {
                        textoPopUp = Controlador.buscarPropiedadPorCriterios(esApartamento,esParaArrendar,rangoArea,rangoEstrato,numeroDeBanhos,numeroDeEspacios,numeroDeGarajes,rangoValor);
                    } catch (RangoNoValidoExcepcion ex) {
                        textoPopUp = "Por favor complete el formulario con valores válidos";
                    }
                    JOptionPane.showMessageDialog(null, textoPopUp, "Información", JOptionPane.INFORMATION_MESSAGE);
                    if (textoPopUp.contains("correctamente")) {
                        ventana.mostrarPanelOpcionesDeFuncionario();
                    }
                }

            }

        });

        botonVolver.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ventana.mostrarPanelOpcionesDeFuncionario();
            }

        });

        ventana.mostrarPanel(this);
    }

    private void setPanelCentral(PanelFormularioGenerico nuevoPanelFormulario) {

        this.panelCentral.remove(panelFormularioInmueble);
        this.panelCentral.remove(comboBoxRol);
        this.panelCentral.remove(panelFormularioRol);
        this.panelFormularioInmueble = nuevoPanelFormulario;
        this.panelCentral.add(panelFormularioInmueble);
        this.add(this.panelDeBotones, BorderLayout.SOUTH);
        this.revalidate();
        this.repaint();
    }

    private void setPanelFormularioRol(PanelFormularioGenerico nuevoPanelRol) {
        this.panelCentral.remove(this.panelFormularioRol);
        this.panelCentral.add(nuevoPanelRol);
        this.panelFormularioRol = nuevoPanelRol;
        this.revalidate();
        this.repaint();
    }

    private void reiniciarPanelRol(JComboBox nuevoJComboBox, PanelFormularioGenerico nuevoPanelRol) {
        this.panelCentral.remove(this.comboBoxRol);
        this.panelCentral.remove(this.panelFormularioRol);
        this.comboBoxRol = nuevoJComboBox;
        this.panelFormularioRol = nuevoPanelRol;
        this.panelCentral.add(this.comboBoxRol);
        this.panelCentral.add(this.panelFormularioRol);
        this.revalidate();
        this.repaint();
    }

    @Override
    public String toString() {
        return "Buscar una propiedad por criterios";
    }

}
